package com.pdweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.pdweb.vo.Usuarios;

public class UsuariosDao extends DBconnection{
	
	private Connection conn;

	public UsuariosDao() throws ClassNotFoundException, SQLException {
		this.conn = getConnection();
	}

	public UsuariosDao(Connection conn) {
		this.conn = conn;
	}

	public void adicionaUsuario(Usuarios usuarios) throws SQLException {

		PreparedStatement st = null;

		try {
			st = conn
					.prepareStatement("insert into Usuarios(TIPO_USUARIO_ID_TIPO_USUARIO_TUSR, FUNCIONARIO_ID_FUNCIONARIO, ST_PASSWORD_USR, ST_LOGIN_USR) value(?,?,?,?);");

			st.setInt(1, usuarios.getIdTipoUsuario());
			st.setInt(2, usuarios.getIdFuncionario());
			st.setString(3, usuarios.getSenha());
			st.setString(4, usuarios.getLogin());
			
			st.execute();
		} finally {
			st.close();
		}
	}

	public List<Usuarios> obterUsuarios() throws SQLException {

		List<Usuarios> usuarios = new ArrayList<Usuarios>();

		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			rs = st.executeQuery("select ID_USUARIO_USR, ST_PASSWORD_USR, tipo_usuario.ST_NOME_TUSR, funcionarios.ST_NOME_FUNC, ST_LOGIN_USR, TIPO_USUARIO_ID_TIPO_USUARIO_TUSR, FUNCIONARIO_ID_FUNCIONARIO from usuarios inner join TIPO_USUARIO on (usuarios.TIPO_USUARIO_ID_TIPO_USUARIO_TUSR = tipo_usuario.ID_TIPO_USUARIO_TUSR) inner join funcionarios  on (usuarios.FUNCIONARIO_ID_FUNCIONARIO = funcionarios.ID_FUNCIONARIO_FUNC) ;" );
			while (rs.next()) {
				Usuarios result = new Usuarios();
				
				result.setIdUsuario(rs.getInt("ID_USUARIO_USR"));
				result.setIdTipoUsuario(rs.getInt("TIPO_USUARIO_ID_TIPO_USUARIO_TUSR"));
				result.setIdFuncionario(rs.getInt("FUNCIONARIO_ID_FUNCIONARIO"));
				result.setSenha(rs.getString("ST_PASSWORD_USR"));
				result.setLogin(rs.getString("ST_LOGIN_USR"));
				result.setNomeFuncionario(rs.getString("funcionarios.ST_NOME_FUNC"));
				result.setTipoUsuario(rs.getString("tipo_usuario.ST_NOME_TUSR"));
				

				usuarios.add(result);
			}
		} finally {
			st.close();
			rs.close();
		}
		return usuarios;
	}

	public void excluirUsuario(Usuarios usuarios) throws SQLException {

		PreparedStatement st = null;

		try {
			st = conn
					.prepareStatement("delete from Usuarios where ID_USUARIO_USR = ?;");

			st.setInt(1, usuarios.getIdUsuario());
			st.execute();
		} finally {
			st.close();
		}
	}

	public Usuarios obterUsuario(Usuarios usuarios) throws SQLException {
		
		Usuarios retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			String sql = "select * from Usuarios where ID_USUARIO_USR = "+usuarios.getIdUsuario()+"; ";

			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Usuarios();
				
				retorno.setIdUsuario(rs.getInt("ID_USUARIO_USR"));
				retorno.setIdTipoUsuario(rs.getInt("TIPO_USUARIO_ID_TIPO_USUARIO_TUSR"));
				retorno.setIdFuncionario(rs.getInt("FUNCIONARIO_ID_FUNCIONARIO"));
				retorno.setSenha(rs.getString("ST_PASSWORD_USR"));
				retorno.setLogin(rs.getString("ST_LOGIN_USR"));
				
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}
	
	public void atualizaUsuario(Usuarios usuarios) throws SQLException{
		
		PreparedStatement st = null;
		try {
			st = conn
					.prepareStatement("UPDATE Usuarios SET TIPO_USUARIO_ID_TIPO_USUARIO_TUSR = ?, FUNCIONARIO_ID_FUNCIONARIO = ?, ST_PASSWORD_USR = ?, ST_LOGIN_USR = ? WHERE ID_USUARIO_USR = ?;");
			
			st.setInt(1, usuarios.getIdTipoUsuario());
			st.setInt(2, usuarios.getIdFuncionario());
			st.setString(3, usuarios.getSenha());
			st.setString(4, usuarios.getLogin());
			st.setInt(5, usuarios.getIdUsuario());
			
			
			st.execute();
		} finally {
			st.close();

		}
	}
	
	public List<Usuarios> consultaUsuario(String sql) throws SQLException {

		List<Usuarios> usuarios = new ArrayList<Usuarios>();

		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			rs = st.executeQuery(sql);
			while (rs.next()) {
				Usuarios result = new Usuarios();
				
				result.setIdUsuario(rs.getInt("ID_USUARIO_USR"));
				result.setIdTipoUsuario(rs.getInt("TIPO_USUARIO_ID_TIPO_USUARIO_TUSR"));
				result.setIdFuncionario(rs.getInt("FUNCIONARIO_ID_FUNCIONARIO"));
				//result.setSenha(rs.getString("ST_PASSWORD_USR"));
				result.setLogin(rs.getString("ST_LOGIN_USR"));
				result.setNomeFuncionario(rs.getString("funcionarios.ST_NOME_FUNC"));
				result.setTipoUsuario(rs.getString("tipo_usuario.ST_NOME_TUSR"));

				usuarios.add(result);
			}
		} finally {
			st.close();
			rs.close();
		}
		return usuarios;
	}
	
	public Usuarios verificaLogin(Usuarios usuarios) throws SQLException {
		
		Usuarios retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			String sql = "select * from Usuarios where ST_LOGIN_USR =  '"+ usuarios.getLogin()+"'  and ST_PASSWORD_USR = '"+usuarios.getSenha()+"' ";

			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Usuarios();

				retorno.setIdUsuario(rs.getInt("ID_USUARIO_USR"));
				retorno.setIdTipoUsuario(rs.getInt("TIPO_USUARIO_ID_TIPO_USUARIO_TUSR"));
				retorno.setIdFuncionario(rs.getInt("FUNCIONARIO_ID_FUNCIONARIO"));
				retorno.setSenha(rs.getString("ST_PASSWORD_USR"));
				retorno.setLogin(rs.getString("ST_LOGIN_USR"));
				
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}
	
	public Usuarios verificaNomeLogin(Usuarios usuarios) throws SQLException{
		
		Usuarios retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			String sql = "select * from Usuarios where ST_LOGIN_USR =  '"+ usuarios.getLogin()+"'";

			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Usuarios();

				retorno.setIdUsuario(rs.getInt("ID_USUARIO_USR"));
				retorno.setIdTipoUsuario(rs.getInt("TIPO_USUARIO_ID_TIPO_USUARIO_TUSR"));
				retorno.setIdFuncionario(rs.getInt("FUNCIONARIO_ID_FUNCIONARIO"));
				retorno.setSenha(rs.getString("ST_PASSWORD_USR"));
				retorno.setLogin(rs.getString("ST_LOGIN_USR"));
				
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}
	
	public Usuarios verificaUsrLogin(Usuarios usuarios) throws SQLException{
		
		Usuarios retorno = null;
		Statement st = null;
		ResultSet rs = null;

		try {
			st = conn.createStatement();
			
			String sql = "select * from Usuarios where FUNCIONARIO_ID_FUNCIONARIO =  '"+ usuarios.getIdFuncionario()+"'";

			rs = st.executeQuery(sql);

			if (rs.next()) {
				retorno = new Usuarios();

				retorno.setIdUsuario(rs.getInt("ID_USUARIO_USR"));
				retorno.setIdTipoUsuario(rs.getInt("TIPO_USUARIO_ID_TIPO_USUARIO_TUSR"));
				retorno.setIdFuncionario(rs.getInt("FUNCIONARIO_ID_FUNCIONARIO"));
				retorno.setSenha(rs.getString("ST_PASSWORD_USR"));
				retorno.setLogin(rs.getString("ST_LOGIN_USR"));
				
			}
			return retorno;
		} finally {
			st.close();
			rs.close();
		}
	}

}
